package main

//middle主要就维护一个list,开启rpc服务，起一个中转的作用
import (
	"container/list"
	"fmt"
	"log"
	"net"
	"net/rpc"
	"rabbitmq/p2p/model"
)

var mqCenter MqCenter

type MqCenter struct {
	list *list.List
}

type Server struct {
}

func main() {
	rpc.Register(&Server{})
	addr, _ := net.ResolveTCPAddr("tcp", ":8081")
	tcp, err := net.ListenTCP("tcp", addr)
	if err != nil {
		log.Println(err)
		return
	}
	for {
		conn, err := tcp.Accept()
		if err != nil {
			log.Println(err)
			return
		}
		rpc.ServeConn(conn)
	}
}

func init() {
	mqCenter = MqCenter{list: list.New()}
}

// Server.PushMessage
func (s *Server) PushMessage(msg *model.Msg, res *model.Res) error {
	fmt.Println("what happen")
	mqCenter.addIntoList(msg)
	fmt.Println("addIntoList:", msg)
	//res的指针不能动，也就是不能让res指向一个新的&model.Res
	res.Ok = true
	res.Error = nil
	return nil
}

//Server.PullMessage
func (s *Server) PullMessage(req *model.Req, msg *model.Msg) error {
	fmt.Println(req)
	front := mqCenter.list.Front()
	//msg.Message = front.Value

	mqCenter.list.Remove(front)
	msg.Message = front.Value.(*model.Msg).Message
	msg.Type = front.Value.(*model.Msg).Type
	fmt.Println("remove:", msg)
	return nil
}

func (mq *MqCenter) addIntoList(msg *model.Msg) {
	fmt.Println(mq.list.Len())
	mq.list.PushBack(msg)
}
